/**************************************************************
 * @file     bsp_uart_driver.h
 * @brief    串口驱动BSP层，接收串口中断的通知，发出数据就绪的通知
 * @author   Ruilist
 * @date     2025-08-10
 * @version  V1.0.0
 * @copyright Copyright (c) 2025
 *
 * @note     1 tab = 4 space
 *           依赖 Circular_buffer.h 中间件获得环形缓冲区
 *
 * @par 日志:
 * - V1.0.0 2025-08-10 Ruilist
 *   接收串口中断的通知，发出数据就绪的通知
 **************************************************************/

//******************************** Includes *********************************//

#ifndef __BSP_UART_DRIVER_H__
#define __BSP_UART_DRIVER_H__

#include <stdint.h>
#include <stdio.h>

#include "main.h"
#include "cmsis_os.h"
#include "usart.h"
#include "semphr.h"

#include "elog.h"
#include "Circular_buffer.h"
#include "app_uart_parse.h"

//******************************** Includes *********************************//

//******************************** Defines **********************************//

extern osThreadId_t bsp_uart_driver_TaskHandle;

extern const osThreadAttr_t bsp_uart_driver_attributes;

//******************************** Defines **********************************//

//*********************Thread_Func **********************//

//*********************Thread_Func **********************//

//*********************Queue_Handler ********************//

extern SemaphoreHandle_t bsp_uart_irq_count;

//*********************Queue_Handler ********************//

//******************************** Declaring ********************************//

/**
 * @brief   bsp_uart_driver任务
 *
 * @param   *argument    任务默认参数
 *
 * @return  空
 *
 */
void bsp_uart_driver_Task_func( void *argument );

#ifdef __CIRCULAR_BUFFER_H__
/**
 * @brief   向APP传递环形缓冲区地址
 *
 * @param[in] circular_buffer_t**p_buffer 通过传入地址指针获得环形缓冲区的地址
 *
 * @return Circular_buffer_status_t
 *
 * @retval CIRCULAR_BUFFER_OK 函数操作成功
 * @retval CIRCULAR_BUFFER_ERROR 函数操作失败
 * @retval INCOME_PARAM_ERROR 传入参数错误
 */
Circular_buffer_status_t bsp_get_buffer_address( circular_buffer_t **p_buffer );
#endif

/**
 * @brief   DMA半满中断
 *
 * @param[in] data_number 数据的个数
 *
 * @return 无
 */
void dma_half_irq_callback( uint32_t data_number );

/**
 * @brief   DMA全满中断
 *
 * @param[in] data_number 数据的个数
 *
 * @return 无
 */
void dma_comp_irq_callback( uint32_t data_number );

/**
 * @brief   UART空闲中断
 *
 * @param[in] data_number 数据的个数
 *
 * @return 无
 */
void uart_idle_irq_callback( uint32_t data_number );

//******************************** Declaring ********************************//

#endif  // End of __BSP_UART_DRIVER_H__